//==== opciones de cabecera ==================================================
header {
  package pl.p03;
}// header
//=== opciones generales a todo el fichero ====================================
options {
}// options
//=============================================================================
//////////////////////////////////
///// Analizador sintáctico  /////
//////////////////////////////////
class SyntaxAnalyzer extends Parser;
  //_____ Zona de opciones del analizador _____________________________________
  options {
    importVocab=LexAnalyzer;  // importar tokens del analizador léxico
    // defaultErrorHandler:
    //    true  => No generar exepciones (Ejecucion normal)
	//    false =>    generar exepciones (Testing)
    defaultErrorHandler=false;
  }// options
  //_____ Zona de definición de tokens ________________________________________
  //tokens {
  //}// tokens
  //_____ Zona de código nativo _______________________________________________
  {
  
  }// código nativo
  //_____ Zona de reglas ______________________________________________________

  start 		: ( sentencia )* EOF ;
  start_kb		: ( sentencia_kb )* EOF ;

  sentencia 	: ( asignacion PUNTO_COMA | set PUNTO_COMA | condicion    | bucle_for    | bucle_while    ) ;
  sentencia_kb	: ( asignacion            | set            | condicion_kb | bucle_for_kb | bucle_while_kb ) ;

  asignacion	: ID OP_ASIG valor ;

  set			: SET USERVAR OP_ASIG valor ;

  condicion		: IF PARENT_A ( ID | USERVAR ) PARENT_C LLAVE_A ( sentencia PUNTO_COMA )+ LLAVE_C ;
  condicion_kb	: IF PARENT_A ( ID | USERVAR ) PARENT_C LLAVE_A ( sentencia_kb         )+ LLAVE_C ;

  bucle_for		: FOR PARENT_A ID OP_ASIG NUMERO TO NUMERO PARENT_C LLAVE_A ( sentencia PUNTO_COMA )+ LLAVE_C;
  bucle_for_kb 	: FOR PARENT_A ID OP_ASIG NUMERO TO NUMERO PARENT_C LLAVE_A ( sentencia_kb         )+ LLAVE_C;

  bucle_while 	: WHILE PARENT_A ( ID | USERVAR ) PARENT_C LLAVE_A ( sentencia PUNTO_COMA )+ LLAVE_C ;
  bucle_while_kb: WHILE PARENT_A ( ID | USERVAR ) PARENT_C LLAVE_A ( sentencia_kb         )+ LLAVE_C ;

  valor			: ( NUMERO | BOOLEAN | DIR | STRING ) ;